// This file is a part of Funky C++.
// Copyright (C) 2011  Valentin David
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.
#ifndef SIGNAL_HH
# define SIGNAL_HH

# include <memory>
# include "type_traits.hh"

namespace funky {
  template <typename T>
  struct signal_traits {
  };

  template <typename T, typename Duration
	    = typename signal_traits<T>::duration>
  T operator+(const T& a,
	      const typename type_traits::identity<Duration>::type& d) {
    T ret{a};
    return ret += d;
  }

  template <typename T, typename Duration
	    = typename signal_traits<T>::duration>
  T operator+(T&& a,
	      const typename type_traits::identity<Duration>::type& d) {
    T ret{std::move(a)};
    return ret += d;
  }
}

#endif
